package cn.com.dcsgo.controller;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 返回jsp视图
 *
 * @author Dcsgo
 * @since 2025/3/2 15:45
 */
@Controller
@RequestMapping("jsp")
public class JspController {

    /**
     * 要想使controller返回视图
     * 1. 方法返回类型是String
     * 2. 不能用ResponseBody修饰方法
     * 3. 返回值为视图名称
     * 这里的请求路径与视图名称无关联自定义
     * 这时使用 HttpServletRequest 向共享域中添加数据供视图解析器解析
     *
     * @param request request
     * @return String
     */
    @GetMapping({"", "home"})
    public String jsp(HttpServletRequest request) {
        //向request域中添加数据 key-value
        request.setAttribute("data", "Hello Jsp!!");
        return "index";
    }

    /**
     * 页面跳转-转发(forward)
     * 返回的视图名称必须以forward:开头
     * 转发只能是当前项目下的页面
     *
     * @return String
     */
    @GetMapping("forward")
    public String forward() {
        return "forward:/jsp/home";
    }

    /**
     * 页面跳转-重定向(redirect)
     * 返回的视图名称必须以redirect:开头
     * 重定向可以跳转到任意可以访问的页面(当然也包括当前项目)
     *
     * @return String
     */
    @GetMapping("redirect")
    public String redirect() {
        return "redirect:https://www.dcsgo.com.cn";
    }
}
/*
在SpringMVC中重定向与转发都不需要指定Tomcat的应用程序上下文
而在JavaEE中
// 转发（需通过 request 对象）
request.getRequestDispatcher("/target.jsp").forward(request, response);

// 重定向（需通过 response 对象，路径需包含项目名）
response.sendRedirect(request.getContextPath() + "/target.jsp");

---------------------------------------------------------------------
在 JavaWeb 开发中，转发（Forward） 和 重定向（Redirect） 是两种不同的页面跳转机制，核心区别如下：

1. 工作位置
转发
发生在服务器内部（如 Servlet 到 JSP），用户无感知。
浏览器仅发送一次请求，服务器直接完成跳转。

重定向
服务器返回 302 响应，要求 客户端重新发起新请求。
浏览器地址栏会显示新 URL。

2. URL 变化
转发
URL 保持不变（显示原始请求路径）。

重定向
URL 变更为新目标地址。

3. 数据共享
转发
共享同一个 request 对象，可通过 request.setAttribute() 传递数据。

重定向
新请求会创建新的 request 对象，原数据丢失（需手动通过 URL 参数或 Session 传递）。

4. 跳转范围
转发
仅限 同一 Web 应用内部 跳转。

重定向
可跳转到 任意 URL（包括外部网站）。

使用场景
转发
▶ 需保留请求数据（如表单提交后跳转到结果页）。
▶ 跳转到同一应用的内部资源。

重定向
▶ 防止表单重复提交（如支付成功后跳转）。
▶ 跨应用跳转（如跳转到第三方网站）。
 */
